package cn.codeinn.gateway.provider;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.stereotype.Component;

import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

@Component
public class MySwaggerResourcesProvider implements SwaggerResourcesProvider {

	/**
	 * swagger2默认的url后缀
	 */
	private static final String SWAGGER2URL = "/v2/api-docs";

	/**
	 * 网关路由
	 */
	private final RouteLocator routeLocator;

	/**
	 * 网关应用名称
	 */
	@Value("${spring.application.name}")
	private String self;

	@Autowired
	public MySwaggerResourcesProvider(RouteLocator routeLocator) {
		this.routeLocator = routeLocator;
	}

	@Override
	public List<SwaggerResource> get() {
		List<SwaggerResource> resources = new ArrayList<>();
		List<String> routeHosts = new ArrayList<>();
		// 由于我的网关采用的是负载均衡的方式，因此我需要拿到所有应用的serviceId
		// 获取所有可用的host：serviceId
		routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
				.filter(route -> !self.equals(route.getUri().getHost()))
				.subscribe(route -> routeHosts.add(route.getUri().getHost()));
		Set<String> dealed = new HashSet<>();
		routeHosts.forEach(instance -> {
			if (!dealed.contains(instance) && !"consul".equals(instance)) {
				dealed.add(instance);
				SwaggerResource swaggerResource = new SwaggerResource();
				swaggerResource.setUrl("/" + instance + SWAGGER2URL);
				swaggerResource.setName(instance);
				resources.add(swaggerResource);
			}
		});
		return resources;
	}

}
